  import scala.io.StdIn
  import scala.util.Random

  /**
   * object 中可以用继承App类来替代main方法，顺序执行，类似于python
   */
  object homework2 extends App {

    // 游戏自定义玩家
    val AIplayers = Map("1" -> "刘备", "2" -> "关羽", "3" -> "张飞")
    // 石头剪刀布
    val fists = Map("1" -> "石头", "2" -> "剪刀", "3" -> "布")

    // 玩家
    var playerA: User = null
    // AI
    var playerB: Computer = null
    // 对战次数
    var times = 0

    // 程序启动主入口，因为没有参数，可以不带
    play

    /**
     * 游戏入口初始页面
     */
    def init: Unit = {
      println("--------欢迎进入游戏世界--------")
      println("****************************")
      println("**********猜拳开始！**********")
      println("****************************\n\n")
      // 用户的角色
      playerA = new User("游客", 0)

      // 用户选择的对战角色
      println("请选择对战角色：（1.刘备 2.关羽 3.张飞）")
      val key = StdIn.readLine()
      playerB = new Computer(AIplayers(key), 0)
    }

    /**
     * 比赛对比逻辑
     * @param ares
     * @param bres
     */
    def judge(ares: String, bres: String) = {
      // 如果相同，平局
      val fair = ares == bres
      if (fair) {
        // 平局
        playerA.score += 1
        playerA.fairs += 1
        playerB.score += 1
        playerB.fairs += 1
        println("结果，和局！下次继续努力！")
      } else {
        val win = (ares == "1" && bres == "2") || (ares == "2" && bres == "3") || (ares == "3" && bres == "1")
        if (win) {
          // 玩家赢
          playerA.score += 2
          playerA.wins += 1
          playerB.fails += 1
          println("恭喜！你赢啦！")
        } else {
          // 玩家输
          playerB.score += 2
          playerB.wins += 1
          playerA.fails += 1
          println("抱歉！你输了！")
        }
      }
    }

    /**
     * 显示对战结果
     */
    def showResults() = {
      println(s"${playerB.name}\tVS\t${playerA.name}")
      println(s"对战次数${times}次\n\n")
      println("姓名\t得分\t胜局\t和局\t负局")
      println(s"${playerA.name}\t${playerA.score}\t${playerA.wins}\t${playerA.fairs}\t${playerA.fails}")
      println(s"${playerB.name}\t${playerB.score}\t${playerB.wins}\t${playerB.fairs}\t${playerB.fails}")
    }

    /**
     * 玩游戏，主逻辑
     */
    def play: Unit = {
      // 初始化对战页面
      init
      // 开始对战
      println(s"你选择了与${playerB.name}对战\n要开始么？y/n")
      var next = true
      var s = StdIn.readLine()
      do {
        s match {
          case "y" => {
            println("请出拳！1.石头 2.剪刀 3.布")
            var ares = playerA.showFist()
            println(s"${playerB.name}出拳！")
            var bres = playerB.showFist()
            // 判断结果
            judge(ares, bres)
            times += 1
            println("是否开始下一轮？（y/n）")
            s = StdIn.readLine()
          }
          case "n" => {
            // 终止对战并显示结果
            next = false
            println("退出游戏！")
            println("------------------------------")
            showResults()
          }
          case _ => {
            println("是否开始下一轮？（y/n）")
            s = StdIn.readLine()
          }
        }
      } while (next)
    }

    /**
     * 电脑角色，随机出拳,存储分数
     * @param name
     * @param score
     */
    class Computer(var name: String, var score: Int) {
      // 也可以定义两个四元组（玩家,胜,和,负）存储结果
      var wins = 0
      var fails = 0
      var fairs = 0

      def showFist(): String = {
        val bres = Random.nextInt(3) + 1
        println(s"${playerB.name}出拳：${fists(bres.toString)}")
        bres.toString
      }
    }

    /**
     * 用户角色，存储分数
     * @param name
     * @param score
     */
    class User(var name: String, var score: Int) {
      var wins = 0
      var fails = 0
      var fairs = 0

      def showFist(): String = {
        var ares = StdIn.readLine()
        if (!fists.keySet.contains(ares)) {
          println("输入不符合规范，默认出布！")
          ares = "3"
        }
        println(s"你出拳：${fists(ares)}")
        ares
      }
    }

  }
